package com.boot.security.server.hitapp.api;

import com.boot.security.server.dto.AjaxJsonVo;
import com.boot.security.server.hitapp.controller.WeixinController;
import com.boot.security.server.model.AppApponit;
import com.boot.security.server.model.AppTradePayno;
import com.boot.security.server.service.SmsService;
import com.boot.security.server.utils.DateUtils;
import com.boot.security.server.utils.WXPayConstants;
import com.jpay.ext.kit.PaymentKit;
import com.jpay.util.StringUtils;
import com.jpay.weixin.api.WxPayApi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

public class hitapi {
    private static Logger log = LoggerFactory.getLogger(WeixinController.class);
    @Value("${wx.appId}")
    private String appId;

    @Value("${wxgzh.mch_id}")
    private String mch_id="1395325302";
    @Value("${wxgzh.appId}")
    private String wxappId="wx82535451c98d5767";

    @Value("${wxgzh.appSecret}")
    private String wxappSecret;
    @Autowired
    private SmsService smsService;

    // partnerKey
    //notify_url
    @Value("${wx.partnerKey}")
    private String partnerKey="nTqIHtZM7CKVcC9jgcRvMYhYZCy0aknz";
    @Value("${wx.notify_url}")
    private String notify_url="http://zll.huaxiadaowei.com/api/wx/wxPay/notify";
    @Value("${wx.appSecret}")
    private String appSecret;

    @Value("${wx.grantType}")
    private String grantType;
    // wx.grantType=authorization_code

    @Value("${wx.requestUrl}")
    private String requestUrl;

    public AjaxJsonVo wxpaydd(AppTradePayno appTradePayno, String paytype) {
        AjaxJsonVo aj = new AjaxJsonVo();
        aj.setSuccess(false);
        String orderId =appTradePayno.getOuttradeno();
        if (StringUtils.isAnyBlank(orderId)){
            aj.setMsg("支付失败,支付所需参数缺失");
            return aj;
        }
        String return_msg = "统一订单失败";
        try {

            //创建 时间戳
            String timeStamp = Long.valueOf(System.currentTimeMillis()).toString();
            //生成32位随机数
            String nonceStr = StringUtils.getUUID();
            //商品描述
            String body =appTradePayno.getSubject()==null? "诊疗服务费用":appTradePayno.getSubject();
            //创建hashmap(用户获得签名)
            SortedMap<String, String> paraMap = new TreeMap<String, String>();
            //设置请求参数(小程序ID)
            paraMap.put("appid", wxappId);
            //设置请求参数(商户号)
            paraMap.put("mch_id", mch_id);
            //设置请求参数(随机字符串)
            paraMap.put("nonce_str", nonceStr);
            //设置请求参数(商品描述)
            paraMap.put("body", body);
            //设置请求参数(商户订单号)
            paraMap.put("out_trade_no", orderId);
            //设置请求参数(总金额,单位分，不能有小数点)
            paraMap.put("total_fee", "1"/*BigInteger.valueOf(Long.parseLong(appTradePayno.getTotalamount())*100).toString()*/);
            //设置请求参数(终端IP) 如果是springmvc,或者能获取到request的servlet,用下面这种
            paraMap.put("spbill_create_ip","");
            //设置请求参数(通知地址)
            paraMap.put("notify_url",notify_url);
            //设置请求参数(交易类型(二维码扫码))
            paraMap.put("trade_type", String.valueOf(WxPayApi.TradeType.NATIVE));
            //设置请求参数(openid)(在接口文档中 该参数 是否必填项 但是一定要注意 如果交易类型设置成'JSAPI'则必须传入openid)
            //paraMap.put("openid", openid);
            //MD5运算生成签名，这里是第一次签名，用于调用统一下单接口
            String sign = PaymentKit.createSign(paraMap, partnerKey);
            paraMap.put("sign", sign);
            //统一下单,向微信api发送数据
            log.info("微信小程序统一下单发送的数据: "+paraMap.toString());
            String xmlResult = WxPayApi.pushOrder(false, paraMap);
            log.info("微信小程序统一下单接受返回的结果: "+xmlResult);
            //转成xml
            Map<String, String> map = PaymentKit.xmlToMap(xmlResult);
            //返回状态码
            String return_code = (String) map.get("return_code");
            return_msg = return_msg+", "+ (String) map.get("return_msg");
            //返回给小程序端需要的参数
            Map<String, String> returnMap = new HashMap<String, String>();
            if(WXPayConstants.SUCCESS.equals(return_code)){
                //返回的预付单信息
                /*returnMap.put("appId",wxappId);
                returnMap.put("nonceStr", nonceStr);
                String prepay_id = (String) map.get("prepay_id");
                returnMap.put("package", "prepay_id=" + prepay_id);
                returnMap.put("signType","MD5");
                //这边要将返回的时间戳转化成字符串，不然小程序端调用wx.requestPayment方法会报签名错误
                returnMap.put("timeStamp", timeStamp);
                //拼接签名需要的参数
                //再次签名，这个签名用于小程序端调用wx.requesetPayment方法
                String paySign = PaymentKit.createSign(returnMap, partnerKey).toUpperCase();
                returnMap.put("paySign", paySign);*/
                returnMap.put("code_url",map.get("code_url"));
                aj.setObj(returnMap);
                aj.setMsg("操作成功");
                aj.setSuccess(true);
                return aj;
            }else{
                aj.setMsg(getMsgByCode(return_code));
                log.error(Thread.currentThread().getStackTrace()[1].getMethodName()+">>>"+return_msg);
            }
        } catch (Exception e) {
            log.error(Thread.currentThread().getStackTrace()[1].getMethodName() +"发生的异常是: ",e);
            aj.setMsg("微信支付下单失败,请稍后再试");
        }
        return aj;
    }
    /**
     * 判断返回的return_code,给前端相应的提示
     * @param return_code
     * @return
     * @author zgd
     * @time 2018年7月9日17:53:13
     */
    private String getMsgByCode(String return_code) {
        switch (return_code){
            case "NOTENOUGH":return "您的账户余额不足";
            case "ORDERPAID":return "该订单已支付完成,请勿重复支付";
            case "ORDERCLOSED":return "当前订单已关闭，请重新下单";
            case "SYSTEMERROR":return "系统超时，请重新支付";
            case "OUT_TRADE_NO_USED":return "请勿重复提交该订单";
            default:return  "网络正在开小差,请稍后再试";
        }
    }
}
